package cn.sypt.yuhao.servlet;

import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import cn.itcast.commons.CommonUtils;
import cn.sypt.yuhao.dao.VideoDao;
import cn.sypt.yuhao.domain.Bcategory;
import cn.sypt.yuhao.domain.User;
import cn.sypt.yuhao.domain.Video;

public class UploadServlet extends HttpServlet {
	private VideoDao vd = new VideoDao();

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		// 创建工具
		FileItemFactory factory = new DiskFileItemFactory();
		/*
		 * 2. 创建解析器对象
		 */
		ServletFileUpload sfu = new ServletFileUpload(factory);
		// sfu.setFileSizeMax(80 * 1024);//设置单个上传的文件上限为80KB
		/*
		 * 3. 解析request得到List<FileItem>
		 */
		List<FileItem> fileItemList = null;
		try {
			fileItemList = sfu.parseRequest(request);
		} catch (FileUploadException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		/*
		 * 4. 把List<FileItem>封装到Book对象中 4.1
		 * 首先把“普通表单字段”放到一个Map中，再把Map转换成Book和Category对象，再建立两者的关系
		 */
		Map<String, Object> map = new HashMap<String, Object>();
		for (FileItem fileItem : fileItemList) {
			if (fileItem.isFormField()) {// 如果是普通表单字段
				map.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));
			}
		}
		Video video = CommonUtils.toBean(map, Video.class);// 把Map中大部分数据封装到Book对象中
		System.out.println("videovideo:"+video.getBname());
		String bname = video.getBname();
		//System.out.println("bname:"+bname);
		User user=(User) request.getSession().getAttribute("user");
		//System.out.println("username:"+user.getUname());
		video.setUname(user.getUname());
		Bcategory bcategory;
		try {
			bcategory = vd.findBybname(bname);
			String fid = vd.findBybid(bcategory.getAid());
			video.setSpid(CommonUtils.uuid());
			video.setSptime(getStringDate());
			video.setBid(bcategory.getBid());
			video.setFid(fid);
		} catch (SQLException e1) {
			throw new RuntimeException(e1);
			//error("您输入的实验分类不正确！", request, response);
		}
		/*
		 * 4.2 把上传的图片保存起来 > 获取文件名：截取之 > 给文件添加前缀：使用uuid前缀，为也避免文件同名现象 >
		 * 校验文件的扩展名：只能是jpg > 校验图片的尺寸 >
		 * 指定图片的保存路径，这需要使用ServletContext#getRealPath() > 保存之 > 把图片的路径设置给Book对象
		 */
		// 获取文件名
		FileItem sptpfile = fileItemList.get(5);// 获取图片
		String sptpurl = sptpfile.getName();
		// 截取文件名，因为部分浏览器上传的绝对路径
		System.out.println(sptpurl);
		int index = sptpurl.lastIndexOf("\\");
		if (index != -1) {
			sptpurl = sptpurl.substring(index + 1);
		}
		// 给文件名添加uuid前缀，避免文件同名现象
		sptpurl = CommonUtils.uuid() + "_" + sptpurl;
		// 校验文件名称的扩展名
/*
		if (!sptpurl.toLowerCase().endsWith(".jpg")) {
			error("上传的图片扩展名必须是JPG", request, response);
			return;
		}*/

		// 校验图片的尺寸
		// 保存上传的图片，把图片new成图片对象：Image、Icon、ImageIcon、BufferedImage、ImageIO
		/*
		 * 保存图片： 1. 获取真实路径
		 */
		String savepath = this.getServletContext().getRealPath("/ui/images");
		/*
		 * 2. 创建目标文件
		 */
		File destFile = new File(savepath, sptpurl);
		/*
		 * 3. 保存文件
		 */
		try {
			sptpfile.write(destFile);// 它会把临时文件重定向到指定的路径，再删除临时文件
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
/*
		// 校验尺寸 // 1. 使用文件路径创建ImageIcon
		ImageIcon icon = new ImageIcon(destFile.getAbsolutePath()); // 2.
																	// 通过ImageIcon得到Image对象
		Image image = icon.getImage(); // 3. 获取宽高来进行校验
		if (image.getWidth(null) > 285 || image.getHeight(null) > 290) {
			error("您上传的图片尺寸超出了285*290！", request, response);
			destFile.delete();// 删除图片
			return;
		}
*/
		// //////////////////////////////////
		///////////////////////////////
		FileItem spfile = fileItemList.get(6);// 获取视频
		String spurl = spfile.getName();
		
		int index1 = spurl.lastIndexOf("\\");
		if (index1 != -1) {
			spurl = spurl.substring(index1 + 1);
		}
		// 给文件名添加uuid前缀，避免文件同名现象
		spurl = CommonUtils.uuid() + "_" + spurl;
		// 校验文件名称的扩展名
/*
		if (!sptpurl.toLowerCase().endsWith(".swf")) {
			error("上传的实验视频扩展名必须是swf", request, response);
			return;
		}
*/
		// 校验图片的尺寸
		// 保存上传的图片，把图片new成图片对象：Image、Icon、ImageIcon、BufferedImage、ImageIO
		/*
		 * 保存图片： 1. 获取真实路径
		 */
		String savepath1 = this.getServletContext().getRealPath("/ui/video");
		/*
		 * 2. 创建目标文件
		 */
		File destFile1 = new File(savepath1, spurl);
		/*
		 * 3. 保存文件
		 */
		try {
			spfile.write(destFile1);// 它会把临时文件重定向到指定的路径，再删除临时文件
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

		
		FileItem spwdfile = fileItemList.get(7);// 获取文档
		String spwdurl = spwdfile.getName();
		
		
		int index2 = spwdurl.lastIndexOf("\\");
		if (index2 != -1) {
			spwdurl = spwdurl.substring(index2 + 1);
		}
		// 给文件名添加uuid前缀，避免文件同名现象
		spwdurl = CommonUtils.uuid() + "_" + spwdurl;
		// 校验文件名称的扩展名
/*
		if (!sptpurl.toLowerCase().endsWith(".jpg")) {
			error("上传的图片扩展名必须是JPG", request, response);
			return;
		}*/

		// 校验图片的尺寸
		// 保存上传的图片，把图片new成图片对象：Image、Icon、ImageIcon、BufferedImage、ImageIO
		/*
		 * 保存图片： 1. 获取真实路径
		 */
		String savepath2 = this.getServletContext().getRealPath("/ui/file");
		/*
		 * 2. 创建目标文件
		 */
		File destFile2 = new File(savepath2, spwdurl);
		/*
		 * 3. 保存文件
		 */
		try {
			spwdfile.write(destFile2);// 它会把临时文件重定向到指定的路径，再删除临时文件
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

		video.setSpurl(spurl);
		video.setSptpurl(sptpurl);
		video.setSpwdurl(spwdurl);
		try {
			vd.addVideo(video);
			request.setAttribute("msg", "恭喜您上传成功");
			request.getRequestDispatcher("/home/msg.jsp")
			.forward(request, response);
		} catch (SQLException e) {
			//throw new RuntimeException(e);
			error("对不起，上传失败，请重新上传！", request, response);
		}
		
		
	}

	public static String getStringDate() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date = formatter.format(currentTime);
		return date;
	}

	private void error(String msg, HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("msg", msg);
		request.getRequestDispatcher("/home/msg.jsp")
				.forward(request, response);
	}

}
